<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="utf-8" lang="utf-8">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>
   加密类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档
  </title>
  <link rel="shortcut icon" href="/user_guide/../images/design/favicon.ico" type="image/x-icon" />
  <link rel="stylesheet" type="text/css" media="all" href="/user_guide/userguide.css" />
  <link rel="search" href="/user_guide/../CodeIgniterSearch.xml" type="application/opensearchdescription+xml" title="CodeIgniter 搜索" />
  <link rel="canonical" href="/user_guide/libraries/encryption.html" />
  <script type="text/javascript" src="/user_guide/nav/nav.js">
  </script>
  <script type="text/javascript" src="/user_guide/nav/prototype.lite.js">
  </script>
  <script type="text/javascript" src="/user_guide/nav/moo.fx.js">
  </script>
  <script type="text/javascript" src="/user_guide/nav/user_guide_menu.js">
  </script>
  <meta name="robots" content="all" />
  <meta name="author" content="ExpressionEngine Dev Team" />
  <meta name="description" content="CodeIgniter 中文手册, CodeIgniter 用户指南, CodeIgniter User Guide, Wiki 文档" />
 </head>
 <body>
  <!-- START NAVIGATION -->
  <div id="nav">
   <div id="nav_inner">
    <script type="text/javascript">
     create_menu('/user_guide/');
    </script>
   </div>
  </div>
  <script type="text/javascript">
   _setNavigation();
  </script>
  <div id="nav2">
   <a name="top">
   </a>
   <a href="javascript:void(0);" onclick="myHeight.toggle();">
    <img src="/user_guide/images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="切换目录" alt="切换目录" />
   </a>
  </div>
  <div id="masthead">
   <table cellpadding="0" cellspacing="0" border="0" style="width:100%">
    <tr>
     <td width="350">
      <h1>
       CodeIgniter 用户指南 版本 2.0.0
      </h1>
     </td>
     
     <td id="breadcrumb_right">
      <a href="/user_guide/toc.html">
       目录页
      </a>
     </td>
    </tr>
   </table>
  </div>
  <!-- END NAVIGATION -->
  <!-- START BREADCRUMB -->
  <table cellpadding="0" cellspacing="0" border="0" style="width:100%">
   <tr>
    <td id="breadcrumb">
     <a href="/" target="_blank">
      CodeIgniter 中国首页
     </a>
     &nbsp;&#8250;&nbsp;
     <a href="/user_guide/toc.html">用户指南目录</a>
     &nbsp;&#8250;&nbsp;加密类
    </td>
    <td id="searchbox">
     <form method="get" action="http://www.google.com/search" target="google_window">
      <input type="hidden" name="client" value="pub-0176846097796333" />
      <input type="hidden" name="forid" value="1" />
      <input type="hidden" name="ie" value="UTF-8" />
      <input type="hidden" name="oe" value="UTF-8" />
      <input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.org.cn/user_guide/" />
      搜索用户指南&nbsp;
      <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />
      &nbsp;
      <input type="submit" class="submit" name="sa" value="Go" />
     </form>
    </td>
   </tr>
  </table>
  <!-- END BREADCRUMB -->
  <div style="clear:both;text-align:right;padding: 6px 40px 0 0;">
   <a href="http://codeigniter.com/user_guide/libraries/encryption.html" target="_blank">
    查看原文
   </a>
  </div>
  <!--<br clear="all"  />-->
  <!-- START CONTENT -->
  <div id="content">
   <h1>
    加密类
   </h1>
   <p>
    数据加密类提供了两种数据加密方式。  It uses a scheme that either compiles
the message using a randomly hashed bitwise XOR encoding scheme, or is encrypted using
the Mcrypt library.  If Mcrypt is not available on your server the encoded message will
still provide a reasonable degree of security for encrypted sessions or other such "light" purposes.
If Mcrypt is available, you'll be provided with a high degree of security appropriate for storage.
   </p>
   <h2>
    设置你的密钥
   </h2>
   <p>
    <em>
     密钥
    </em>
    实际上是一些会控制密码加密过程并且允许被加密的字串被解码的信息片段。实际上，你选择的密钥会提供一个
    <strong>
     唯一
    </strong>
    的方法来解密一些被加密的数据，所以你需要非常谨慎的设置你的密钥，如果你想给一些固定的数据加密的话，你最好不要更改这个密钥。
   </p>
   <p>
    很自然，你需要非常小心的保守你的密钥。如果某人对您的密钥能够存取，那么数据将会很容易地被解码。如果您的服务器不完全在的您的控制之下而想保证数据安全是不可能的，因此您可以在使用它之前仔细地想一下要求高安全存放信用卡数字对象的方法。
   </p>
   <p>
    为了发挥加密算法的最大优势，你的解密密钥需要被设置为 32 个字符长度（128 位）。你可以设置一个编造的随机字符串作为你的密钥，最好包括数字、大写字母、小写字母。你的密钥
    <strong>
     不能
    </strong>
    设置为一个简单的文本字符串。为了被安全可靠的加密，它也有一个随机的可能性。
   </p>
   <p>
    你的密钥可以放在
    <dfn>
     application/config/config.php
    </dfn>
    文件中，你也可以自己设置一个存储机制用于数据的加密和解密。
   </p>
   <p>
    为了在
    <dfn>
     application/config/config.php
    </dfn>
    文件中保存你的密钥，打开文件设置一下：
   </p>
   <code>
    $config['encryption_key'] = &quot;YOUR KEY&quot;;
   </code>
   <h2>
    消息长度
   </h2>
   <p>
    知道加密信息的长度会是原来函数长度的 2.6 倍是很重要的。如果你加密这个字符串&ldquo;my super secret data&rdquo;，它的长度是 21 个字符，所以你加密后的字符串的长度大概是 55 个字符（我们说它是粗糙的，因为编码的字符串长度增量 64 位并非是线性增长的），当你选择你的数据存储机制的时候一定要记住这一点。例如，Cookie 可以占用 4k 的数据空间。
   </p>
   <h2>
    初始化类
   </h2>
   <p>
    在 Codeigniter 中，像大多数其他的类一样，加密类也需要在你的控制器函数中用
    <dfn>
     $this-&gt;load-&gt;library
    </dfn>
    函数加载：
   </p>
   <code>
    $this-&gt;load-&gt;library('encrypt');
   </code>
   <p>
    一旦被加载，加密类库就可以这样使用：
    <dfn>
     $this-&gt;encrypt
    </dfn>
   </p>
   <h2>
    $this-&gt;encrypt-&gt;encode()
   </h2>
   <p>
    执行数据加密并返回一个字符串。例如：
   </p>
   <code>
    $msg = 'My secret message';
    <br />
    <br />
    $encrypted_string = $this-&gt;encrypt-&gt;encode($msg);
   </code>
   <p>
    如果你不想在你的配置文件中使用一个密钥，你可以通过第二个参数随意设置你的密钥。
   </p>
   <code>
    $msg = 'My secret message';
    <br />
    $key = 'super-secret-key';
    <br />
    <br />
    $encrypted_string = $this-&gt;encrypt-&gt;encode($msg, $key);
   </code>
   <h2>
    $this-&gt;encrypt-&gt;decode()
   </h2>
   <p>
    解密一个已加密的字符串。例如：
   </p>
   <code>
    $encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';
    <br />
    <br />
    $plaintext_string = $this-&gt;encrypt-&gt;decode($encrypted_string);
   </code>
   <p>
    You can optionally pass your encryption key via the second parameter if you don't want to use the one in your config file:
   </p>
   <code>
    $msg = 'My secret message';
    <br />
    $key = 'super-secret-key';
    <br />
    <br />
    $encrypted_string = $this-&gt;encrypt-&gt;decode($msg, $key);
   </code>
   <h2>
    $this-&gt;encrypt-&gt;set_cipher();
   </h2>
   <p>
    允许你设置一个 Mcrypt 算法。默认使用
    <samp>
     MCRYPT_RIJNDAEL_256
    </samp>
    。例如：
   </p>
   <code>
    $this-&gt;encrypt-&gt;set_cipher(MCRYPT_BLOWFISH);
   </code>
   <p>
    请访问 php.net 看一下
    <a href="http://php.net/mcrypt">
     可用的算法
    </a>
    。
   </p>
   <p>
    如果你想手动测试一下你的服务器是否支持 Mcrypt，你可以使用：
   </p>
   <code>
    echo ( ! function_exists('mcrypt_encrypt')) ? 'Nope' : 'Yup';
   </code>
   <h2>
    $this-&gt;encrypt-&gt;set_mode();
   </h2>
   <p>
    允许你设置一个 Mcrypt 模式。默认使用
    <samp>
     MCRYPT_MODE_CBC
    </samp>
    。例如：
   </p>
   <code>
    $this-&gt;encrypt-&gt;set_mode(MCRYPT_MODE_CFB);
   </code>
   <p>
    请访问 php.net 看一下
    <a href="http://php.net/mcrypt">
     可用的模式
    </a>
    。
   </p>
   <h2>
    $this-&gt;encrypt-&gt;sha1();
   </h2>
   <p>
    SHA1 编码函数。提供一个字符串，然后它返回一个 160 位的 Hash 信息。说明：SHA1，就像 MD5 一样不可解密。例如：
   </p>
   <code>
    $hash = $this-&gt;encrypt-&gt;sha1('Some string');
   </code>
   <p>
    许多 PHP 安装程序默认都支持 SHA1，所以你可以很简单的使用它的原始函数进行加密：
   </p>
   <code>
    $hash = sha1('Some string');
   </code>
   <p>
    如果你的服务器不支持 SHA1，你可以使用别人提供的函数。
   </p>
   <h2 id="legacy">
    $this-&gt;encrypt-&gt;encode_from_legacy(
    <kbd>
     $orig_data
    </kbd>
    ,
    <kbd>
     $legacy_mode
    </kbd>
    = MCRYPT_MODE_ECB,
    <kbd>
     $key
    </kbd>
    = '');
   </h2>
   <p>
    Enables you to re-encode data that was originally encrypted with CodeIgniter 1.x to be compatible with the Encryption library in CodeIgniter 2.x.  It is only
  necessary to use this method if you have encrypted data stored permanently such as in a file or database and are on a server that supports Mcrypt.  "Light" use encryption
  such as encrypted session data or transitory encrypted flashdata require no intervention on your part.  However, existing encrypted Sessions will be
  destroyed since data encrypted prior to 2.x will not be decoded.
   </p>
   <p class="important">
    <strong>
     Why only a method to re-encode the data instead of maintaining legacy methods for both encoding and decoding?
    </strong>
    The algorithms in
  the Encryption library have improved in CodeIgniter 2.x  both for performance and security, and we do not wish to encourage continued use of the older methods.
  You can of course extend the Encryption library if you wish and replace the new methods with the old and retain seamless compatibility with CodeIgniter 1.x
  encrypted data, but this a decision that a developer should make cautiously and deliberately, if at all.
   </p>
   <code>
    $new_data = $this-&gt;encrypt-&gt;encode_from_legacy(
    <kbd>
     $old_encrypted_string
    </kbd>
    );
   </code>
   <table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder">
    <tr>
     <th>
      Parameter
     </th>
     <th>
      Default
     </th>
     <th>
      Description
     </th>
    </tr>
    <tr>
     <td class="td">
      <strong>
       $orig_data
      </strong>
     </td>
     <td class="td">
      n/a
     </td>
     <td class="td">
      The original encrypted data from CodeIgniter 1.x's Encryption library
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       $legacy_mode
      </strong>
     </td>
     <td class="td">
      MCRYPT_MODE_ECB
     </td>
     <td class="td">
      The Mcrypt mode that was used to generate the original encrypted data.  CodeIgniter 1.x's default was MCRYPT_MODE_ECB, and it will
    assume that to be the case unless overridden by this parameter.
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       $key
      </strong>
     </td>
     <td class="td">
      n/a
     </td>
     <td class="td">
      The encryption key.  This it typically specified in your config file as outlined above.
     </td>
    </tr>
   </table>
   <p>
    &nbsp;
   </p>
   <div id="Contributors">
    翻译贡献者:
baiyuxiong, Hex, qixingyue, zhupeng
   </div>
   <div id="DocDate">
    最后修改: 2011-04-06 23:38:13
   </div>
  </div>
  <!-- END CONTENT -->
  <div id="footer">
   <p>
    上一个主题:&nbsp;&nbsp;
    <a href="/user_guide/libraries/email.html">
     Email 类
    </a>
    &nbsp;&nbsp;&middot;&nbsp;&nbsp;
    <a href="#top">
     页首
    </a>
    &nbsp;&middot;&nbsp;&nbsp;
    <a href="/user_guide/toc.html">用户指南目录</a>
    &nbsp;&nbsp;&middot;&nbsp;&nbsp;下一个主题:&nbsp;&nbsp;
    <a href="/user_guide/libraries/file_uploading.html">
     文件上传类
    </a>
   </p>
   <p>
    <a href="http://codeigniter.com">
     CodeIgniter
    </a>
    &nbsp;&middot;&nbsp; 版权所有 &#169; 2006-2011 &nbsp;&middot;&nbsp;
    <a href="http://ellislab.com/">
     Ellislab, Inc.
    </a>
   </p>
   <p>
    中文化:
    <a href="">
     CodeIgniter 中国
    </a>
    &nbsp;&middot;&nbsp; 制作: Hex &nbsp;&middot;&nbsp; 版本: 1.20 &nbsp;&middot;&nbsp; 鸣谢: 子非鱼
   </p>
  </div>
  
  <div style="display:none">
   
   <noscript>
    <a href="http://www.51.la/?3289908" target="_blank">
     <img alt="我要啦免费统计" src="http://img.users.51.la/3289908.asp" style="border:none" />
    </a>
   </noscript>
  </div>
 </body>
</html>